【MySQL】NULL / NOT NULL 制約 - NULLの許容可否

【MySQL】NULL / NOT NULL 制約 - NULLの許容可否

MySQLのNULL / NOT NULL制約について解説します。

検証環境

NULL

NULL値が無い(空)であることを示す値です。

MySQLではNULL制約またはNOT NULL制約によって、カラムがNULLを許可するかどうかを定義できます。

NULL制約

NULL制約は“NULLを許可する制約”です。

NULLに関する制約がない場合、デフォルトではNULLを許可しますが、NULL制約で明示的に示すことができます。

基本構文

カラム定義 NULL

サンプル

___ih_hl_start
mysql> CREATE TABLE sample ( num INT NULL );
___ih_hl_end
Query OK, 0 rows affected (0.01 sec)

___ih_hl_start
mysql> INSERT INTO sample VALUE ( NULL );
___ih_hl_end
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM sample;
+------+
| num  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

1行目のsampleテーブルの定義において、numカラムにNULL制約を適用しています。

4行目ではnumカラムの値がNULLのレコードを追加するクエリを実行しており、正常に処理されたことが分かります。

NOT NULL制約

NOT NULL制約は“NULLを拒否する制約”です。

基本構文

カラム定義 NOT NULL

サンプル

___ih_hl_start
mysql> CREATE TABLE sample ( num INT NOT NULL );
___ih_hl_end
Query OK, 0 rows affected (0.01 sec)

___ih_hl_start
mysql> INSERT INTO sample VALUE ( NULL );
___ih_hl_end
ERROR 1048 (23000): Column 'num' cannot be null

1行目のsampleテーブルの定義において、numカラムにNOT NULL制約を適用しています。

4行目ではnumカラムの値がNULLのレコードを追加するクエリを実行していますが、エラーが発生しています。

制約の確認

NULL / NOT NULLの制約はDESCを使ったテーブル情報で確認できます。

mysql> CREATE TABLE sample ( num1 INT NULL, num2 INT NOT NULL );
Query OK, 0 rows affected (0.01 sec)

mysql> DESC sample;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| num1  | int  | YES  |     | NULL    |       |
| num2  | int  | NO   |     | NULL    |       |
+-------+------+------+-----+---------+-------+
2 rows in set (0.01 sec)

NULLの項目がYESならNULLを許可、NOならNULLを拒否します。